热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

体量|更多_初识protobuf

篇首语:本文由编程笔记#小编为大家整理,主要介绍了初识protobuf相关的知识,希望对你有一定的参考价值。 protobuf在go语言中的应用 1、什么是protobuf? pro

篇首语:本文由编程笔记#小编为大家整理,主要介绍了初识protobuf相关的知识,希望对你有一定的参考价值。



protobuf在go语言中的应用

1、什么是protobuf?



protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。


Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。


你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。 ——https://developers.google.com/protocol-buffers/


简而言之,protobuf是一种序列化结构数据的方法,类似于XML、JSON,是一种数据传输格式,它的存储方式是二进制,所以有体量更小,解析速度更快的特点。

proto不能像JSON和XML一样开箱即用,需要利用工具(protoc)来编译成常用语言的所能够使用的文件(如果.java,.go等)。

protobuf更像是一个API合同,能够供服务端(Server)和客户端(Client)同时“阅读”的一种API约定、协议。其实它就是协议的一个缓冲文件,缓冲更好地凸显了它的名字中的buf(即buffers)


2、为什么要使用protobuf?


  1. 易读且容易理解
  2. 不同语言可以互相操作,因为可以利用工具生成不同语言的代码文件
  3. 体积小(存储方式是二进制)
  4. 更快的传输效率(存储方式是二进制)
  5. 相较于JSON和XML有更高效的序列化能力
  6. 非常安全(客户端和服务端之间强类型的API合同)

3、支持序列化

序列化的定义:序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。

可以把proto文件理解为上述所描述的存储区,可以从proto文件中反序列化出对象的状态,并且创建该对象。

proto相较于普通的序列化强大的一点是,它可以由开发人员按照一定的规范编写文件,并且可以利用protoc反序列化成其他任意语言能够解释的对象。



如果有接触过Java的序列化就能更好理解,Java的序列化会将此时的Java对象的状态序列化到文件当中,但是该文件是不可读的,然后可以利用Java的反序列化将当时的Java对象的状态重建。



4、proto2和proto3

protobuf有两个大版本,proto2和proto3,目前比较新的都是使用proto3,proto3相较于proto2增加了更多语言的支持。


5、protobuf包含什么?


  • 业务的描述(service)
  • 有效负载消息实体(message)

6、第一次使用protobuf


1、创建新的项目

其中包含两个目录

.
├── go.mod
├── pb #proto编译后的文件
├── proto #proto原始文件

2、创建test.proto文件

确保IDE已经安装了proto相关的插件。

在proto目录下创建

syntax = "proto3";
option go_package = ".;pb";
message SearchRequest
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;

3、利用protoc来编译

确保go是1.1版本以上并且能够正常使用go mod

安装能够将proto文件编译成go能够使用的文件的插件protoc-gen-go

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

执行protoc编译命令

protoc --proto_path=proto proto/*.proto --go_out=pb

可以看到pb目录下已经有了经protoc编译后的文件

.
├── go.mod
├── pb
│ └── test.pb.go
├── proto
│ └── test.proto

4、使用.go文件中的go对象

**OK!**现在已经完成了一次proto文件的编写、以及编译,接下来就可以直接使用.go文件中的go语言能够使用的对象了。

接下来更需要关心的是proto文件的具体编写。


7、编写proto文件

syntax = "proto3";指定该proto文件的语法是proto3(必须)

option go_package = ".;pb";指定该proto输出到当前目录下的pb文件夹

message xxx
// 字段规则:required -> 字段只能也必须出现 1 次
// 字段规则:optional -> 字段可出现 0 次或1次
// 字段规则:repeated -> 字段可出现任意多次(包括 0)
// 类型:int32、int64、sint32、sint64、string、32-bit ....
// 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字)
字段规则 类型 名称 = 字段编号;

定义消息实体


8、总结


  1. XML、JSON、Protobuf都具有数据传输的能力
  2. XML、JSON注重数据结构化,Protobuf注重数据序列化
  3. Protobuf使用场景更明确,XML、JSON使用场景更丰富且多元(更普遍)。

推荐阅读
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文详细解析了ASP.NET 2.0中的Callback机制,不仅介绍了基本的使用方法,还深入探讨了其背后的实现原理。通过对比Atlas框架,帮助读者更好地理解和应用这一机制。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • WCF类型共享的最佳实践
    在使用WCF服务时,经常会遇到同一个实体类型在不同服务中被生成为不同版本的问题。本文将介绍几种有效的类型共享方法,以解决这一常见问题。 ... [详细]
  • 使用ArcGIS for Java和Flex浏览自定义ArcGIS Server 9.3地图
    本文介绍了如何在Flex应用程序中实现浏览自定义ArcGIS Server 9.3发布的地图。这是一个基本的入门示例,适用于初学者。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 本文最初发表在Thorben Janssen的Java EE博客上,每周都会分享最新的Java新闻和动态。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • 本文详细介绍了如何在PHP中记录和管理行为日志,包括ThinkPHP框架中的日志记录方法、日志的用途、实现原理以及相关配置。 ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
author-avatar
手机用户2702932894
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有